#include <stdio.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/types.h>
#include <errno.h>
#include <string.h>

// 消息队列结构体
struct msgbuf{
	long mtype; // 标识位，必须大于0
	char mtext[100]; // 具体传输的数据
};

int main(int argc, char const *argv[])
{
	// 1.申请系统键值 ftok
	key_t key = ftok(".", 1);
	if(key == -1)
	{
		perror("ftok error\n");
		return -1;
	}
	// 2.申请消息队列，并获得id号 msgget
	int msgid = msgget(key, IPC_CREAT|IPC_EXCL|0666);
	if(msgid == -1)
	{
		// 如果key对应的消息队列已经存在，那么可以直接获取id
		if(errno == EEXIST)
		{
			msgid = msgget(key, 0666);
			if(msgid == -1)
			{
				perror("msgget error\n");
				return -1;
			}
		}
	}
	// 3.消息队列的数据发送和接受，配置消息队列结构体，msgsnd/msgrcv
	// 定义消息队列的结构体变量，用于传输数据
	struct msgbuf buf;
	buf.mtype = 1; // 发送标识位1的数据
	while(1)
	{
		printf("请输入需要发送的消息\n");
		scanf("%s", buf.mtext);
		msgsnd(msgid, &buf, sizeof(buf), 0);
		if(strcmp(buf.mtext, "bye") == 0)
			break;
	}
	// 4.销毁消息队列 msgctl IPC_RMID
	
	return 0;
}
